﻿using DragonBones;

using UnityEngine;

namespace Assets.XyzCode.Fight.Game.Player
{
    partial class Player_MissDie_Behav
    {
        /** 跑动速度 - X */
        private const float RUN_SPEED_X = 6.4f;

        /** 跑动速度 - Z */
        private const float RUN_SPEED_Z = 10.24f;

        /** 面向右侧 */
        private readonly Quaternion FACE_TO_R = Quaternion.Euler(0, 0, 0);

        /** 面向左侧 */
        private readonly Quaternion FACE_TO_L = Quaternion.Euler(0, 180, 0);

        /// <summary>
        /// 执行跑动
        /// </summary>
        /// <param name="dirX">X 轴上的移动方向, dirX &lt; 0 往左, dirX == 0 不动, dirX &gt; 0 往右</param>
        /// <param name="dirZ">Z 轴上的移动方向 ( 注意是 Z 轴不是 Y 轴 ), dirZ &lt; 0 往外, dirZ == 0 不动, dirZ &gt; 0 往里</param>
        public void DoRun(int dirX, int dirZ)
        {
            if (!CanSwitchStateTo(StateEnum.Run))
            {
                return;
            }

            if (StateEnum.Run != _currState)
            {
                // 因为跑动状态是可以自环的的,
                // 所以就必须在此判断, 避免重复播放动画...
                _currState = StateEnum.Run;
                PlayDBAnim("Run", -1, 1.28f);
            }

            if (dirX < 0) { dirX = -1; } else if (dirX > 0) { dirX = 1; }
            if (dirZ < 0) { dirZ = -1; } else if (dirZ > 0) { dirZ = 1; }

            if (0 != dirX)
            {
                if (dirX > 0)
                {
                    transform.localRotation = FACE_TO_R;
                    _VIEW.GetComponent<UnityArmatureComponent>().armature.flipX = false;
                }
                else
                {
                    // 修改转向并修改 VIEW 的方向
                    transform.localRotation = FACE_TO_L;
                    _VIEW.GetComponent<UnityArmatureComponent>().armature.flipX = true;
                }
            }

            // 转身后这里就需要修改为使用 position,
            // 否则移动方向就会发生错误!
            // 这个需要在课上给学生们解释一下原因...
            transform.position +=
                    Vector3.right * dirX * RUN_SPEED_X * Time.deltaTime
                + Vector3.forward * dirZ * RUN_SPEED_Z * Time.deltaTime;
        }
    }
}
